package model;

import java.util.HashSet;
import java.util.Set;

import Interfaces.Ficha;

public class Pieza {

	/**
	 * Se define la cantidad de piezas totales a priori como constante, 
	 * dado el alcance limitado que tiene la resolución del pentominó.
	 */
	public static final int PIEZAS_TOTALES = 12; 

	/**
	 * Se define la cantidad de cuadrados que conforman una pieza, 
	 * a priori como constante por naturaleza del pentominó.
	 */
	public static final int CUADRADOS_POR_PIEZA = 5; 
	
	private final Ficha ficha;
	private Set<Variante> variantes;
	
	/**
	 * Crea la pieza desde la especificación de una ficha.
	 * @param base desde donde se arma la pieza con todas 
	 * sus variantes.
	 */
	public Pieza(final Ficha base) {
		super();
		this.ficha = base;
	}
	
	/**
	 * Genera las variantes que tiene la pieza, obtenidas con una serie de
	 * variadores combinados, lo que permite probar todas las orientaciones
	 * posibles en 2D y cubrir todo el abanico de posibilidades, para 
	 * cualquier pieza.
	 * @return conjunto de variantes generadas.
	 */
	protected Set<Variante> generarVariantes() {
		// Al usar un set, si se repite la variante entre los variadores,
		// se evita devolver un conjunto con repetidos.
		final Set<Variante> variantes = new HashSet<Variante>();
		for (Variator variator : Variator.DEFAULTS) {
			variantes.add(new Variante(this, variator));
		}
		return variantes;
	}
	
	/**
	 * Devuelve las variantes de la pieza.
	 * @return variantes generadas.
	 */
	public Set<Variante> getVariantes() {
		// Se generan una sola vez, on demand.
		if (variantes == null) {
			this.variantes = generarVariantes();
		}
		return variantes;
	}
	
	public Ficha getFicha() {
		return ficha;
	}
	
}
